{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a020dc30-f14c-4d84-ad18-6bb6a5ae63ff",
   "metadata": {},
   "source": [
    "# 第八节、数组的形状改变"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "318bd004-7dd1-4dcc-b4b1-00859f31843c",
   "metadata": {},
   "source": [
    "## 数组变形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1edf347b-2238-4df0-871a-1306154104e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "aa394c65-8942-424d-ad0b-e220ed840d17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7, 7, 3, 6, 3],\n",
       "       [4, 8, 5, 2, 8],\n",
       "       [9, 8, 1, 6, 2],\n",
       "       [4, 9, 2, 4, 4]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1 = np.random.randint(0, 10, size=(4, 5))\n",
    "arr1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "32bb2a00-fd04-41c7-97f3-727efac8cfc9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4, 5)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4679a62e-33f3-4415-bdbe-73cda9800291",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 7, 3, 6, 3, 4, 8, 5, 2, 8, 9, 8, 1, 6, 2, 4, 9, 2, 4, 4])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# reshape里面传入-1代表压扁成一维\n",
    "arr2 = arr1.reshape(-1)\n",
    "arr2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "cb8fa6b8-05b9-4ebe-bf4b-39a7bc00154d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7, 7, 3, 6, 3, 4, 8, 5, 2, 8],\n",
       "       [9, 8, 1, 6, 2, 4, 9, 2, 4, 4]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3 = arr2.reshape(2, 10)\n",
    "arr3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "146a50d7-ae2b-4344-a673-e8eb6ac6d390",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7, 7, 3, 6],\n",
       "       [3, 4, 8, 5],\n",
       "       [2, 8, 9, 8],\n",
       "       [1, 6, 2, 4],\n",
       "       [9, 2, 4, 4]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# -1表示自动的去计算，对应的行和列\n",
    "arr4 = arr1.reshape(5, -1)\n",
    "arr4"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "323cce30-34ee-4b12-9c5c-504759f95de0",
   "metadata": {},
   "source": [
    "## 数组转置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d4b06482-e55e-4082-bba0-681d30e45789",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5, 6, 9, 1, 0],\n",
       "       [8, 3, 1, 9, 8],\n",
       "       [3, 4, 9, 8, 6]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1 = np.random.randint(0, 10, size=(3, 5))\n",
    "arr1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4c9feabe-0ae7-4c91-92a8-d34020c32f1f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5, 8, 3],\n",
       "       [6, 3, 4],\n",
       "       [9, 1, 9],\n",
       "       [1, 9, 8],\n",
       "       [0, 8, 6]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# .T简单操作直接转置\n",
    "arr1.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9f65014c-ba37-4f3e-aaa2-a48aafb87c34",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5, 8, 3],\n",
       "       [6, 3, 4],\n",
       "       [9, 1, 9],\n",
       "       [1, 9, 8],\n",
       "       [0, 8, 6]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果还想玩出不一样的可以使用transpose方法\n",
    "np.transpose(arr1, axes=(1, 0))   # axes参数得好好说说"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "eb038c9a-23e2-4e8b-9bf6-7b08c2bd588b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[2, 8, 3, 2],\n",
       "        [3, 4, 5, 3],\n",
       "        [2, 8, 0, 7],\n",
       "        [2, 6, 6, 6],\n",
       "        [3, 6, 2, 6],\n",
       "        [1, 1, 3, 8]],\n",
       "\n",
       "       [[3, 3, 0, 2],\n",
       "        [6, 5, 1, 0],\n",
       "        [5, 6, 6, 0],\n",
       "        [1, 0, 5, 4],\n",
       "        [3, 7, 7, 1],\n",
       "        [9, 3, 6, 5]],\n",
       "\n",
       "       [[0, 0, 2, 0],\n",
       "        [5, 1, 4, 1],\n",
       "        [1, 3, 4, 7],\n",
       "        [9, 6, 3, 5],\n",
       "        [1, 2, 6, 4],\n",
       "        [3, 9, 3, 3]]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# axes参数，传入一个元组，元组从左到右依次是第1个维度，第2个维度，第3个维度\n",
    "# 可以理解成，(行, 列, 通道)他们有对应的索引 (0,1,2)\n",
    "# 如果你更改索引的位置 (0, 1, 2)  ==>  (2, 1, 0)那么索引对应的元素也就会被转置\n",
    "arr2 = np.random.randint(0, 10, size=(3, 6, 4))\n",
    "arr2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "45c3cee2-8c15-49fd-948f-6e3c41a1ef27",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 6, 4)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "bb270569-c75c-4f91-a384-3edaeb00794d",
   "metadata": {},
   "outputs": [],
   "source": [
    "arr3 = arr2.transpose(2, 1, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "fb76e181-b644-4a89-b2fe-64753cc7b304",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4, 6, 3)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "1e420143-39ad-4375-aa93-81f00d2a6219",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[2, 3, 0],\n",
       "        [3, 6, 5],\n",
       "        [2, 5, 1],\n",
       "        [2, 1, 9],\n",
       "        [3, 3, 1],\n",
       "        [1, 9, 3]],\n",
       "\n",
       "       [[8, 3, 0],\n",
       "        [4, 5, 1],\n",
       "        [8, 6, 3],\n",
       "        [6, 0, 6],\n",
       "        [6, 7, 2],\n",
       "        [1, 3, 9]],\n",
       "\n",
       "       [[3, 0, 2],\n",
       "        [5, 1, 4],\n",
       "        [0, 6, 4],\n",
       "        [6, 5, 3],\n",
       "        [2, 7, 6],\n",
       "        [3, 6, 3]],\n",
       "\n",
       "       [[2, 2, 0],\n",
       "        [3, 0, 1],\n",
       "        [7, 0, 7],\n",
       "        [6, 4, 5],\n",
       "        [6, 1, 4],\n",
       "        [8, 5, 3]]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83fe60be-713a-4b59-a10a-ab7a9dc77659",
   "metadata": {},
   "source": [
    "## 数组堆叠"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "70157ef9-7fa3-4eee-a20b-07854b65d4d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "40652ba5-2527-4fcc-9b85-3de0e0fcb0bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[11., 12., 13., 14., 15., 16., 17., 18.],\n",
       "       [19., 20., 21., 22., 23., 24., 25., 26.],\n",
       "       [27., 28., 29., 30., 31., 32., 33., 34.],\n",
       "       [35., 36., 37., 38., 39., 40., 41., 42.],\n",
       "       [43., 44., 45., 46., 47., 48., 49., 50.]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 先创建两个数组，它们有个特点，就是行不同但列相同\n",
    "n1 = np.linspace(11, 50, num=40).reshape(5, -1)\n",
    "n1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "b116ba6c-89ec-45cd-b3db-3ef89199a43c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.22, 0.61, 0.38, 0.13, 0.36, 0.53, 0.62, 0.04],\n",
       "       [0.62, 0.67, 0.18, 0.05, 0.36, 0.37, 0.1 , 0.5 ],\n",
       "       [0.69, 0.34, 0.76, 0.67, 0.92, 0.99, 0.65, 0.7 ]])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n2 = np.random.random(size=(3, 8)).round(2)\n",
    "n2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "faa27789-7b19-4f95-bc8d-841adf21702d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[11.  , 12.  , 13.  , 14.  , 15.  , 16.  , 17.  , 18.  ],\n",
       "       [19.  , 20.  , 21.  , 22.  , 23.  , 24.  , 25.  , 26.  ],\n",
       "       [27.  , 28.  , 29.  , 30.  , 31.  , 32.  , 33.  , 34.  ],\n",
       "       [35.  , 36.  , 37.  , 38.  , 39.  , 40.  , 41.  , 42.  ],\n",
       "       [43.  , 44.  , 45.  , 46.  , 47.  , 48.  , 49.  , 50.  ],\n",
       "       [ 0.22,  0.61,  0.38,  0.13,  0.36,  0.53,  0.62,  0.04],\n",
       "       [ 0.62,  0.67,  0.18,  0.05,  0.36,  0.37,  0.1 ,  0.5 ],\n",
       "       [ 0.69,  0.34,  0.76,  0.67,  0.92,  0.99,  0.65,  0.7 ]])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 纵方向堆叠\n",
    "np.set_printoptions(suppress=True)\n",
    "np.concatenate([n1, n2], axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "2b09ef8b-1e14-41be-a386-3c6cae99c25d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[11., 12., 13., 14., 15.],\n",
       "       [19., 20., 21., 22., 23.],\n",
       "       [27., 28., 29., 30., 31.]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([[0.04, 0.62],\n",
       "       [0.5 , 0.1 ],\n",
       "       [0.7 , 0.65]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([[ 0.04,  0.62, 11.  , 12.  , 13.  , 14.  , 15.  ],\n",
       "       [ 0.5 ,  0.1 , 19.  , 20.  , 21.  , 22.  , 23.  ],\n",
       "       [ 0.7 ,  0.65, 27.  , 28.  , 29.  , 30.  , 31.  ]])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 横方向堆叠\n",
    "n3 = n1[:3, :5].copy()  # shape=(3, 5)\n",
    "n4 = n2[:3, -1:-3:-1]   # shape=(3, 2)\n",
    "display(n3, n4)\n",
    "\n",
    "np.concatenate([n4, n3], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "435b7fc7-c6b3-4a67-b20e-44a1a49771e9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[11.  , 12.  , 13.  , 14.  , 15.  ,  0.04,  0.62],\n",
       "       [19.  , 20.  , 21.  , 22.  , 23.  ,  0.5 ,  0.1 ],\n",
       "       [27.  , 28.  , 29.  , 30.  , 31.  ,  0.7 ,  0.65]])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# hstack 水平方向堆叠\n",
    "np.hstack([n3, n4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "bc756114-f0a7-42a4-8845-c32077f9c04f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.22,  0.61,  0.38,  0.13,  0.36,  0.53,  0.62,  0.04],\n",
       "       [ 0.62,  0.67,  0.18,  0.05,  0.36,  0.37,  0.1 ,  0.5 ],\n",
       "       [ 0.69,  0.34,  0.76,  0.67,  0.92,  0.99,  0.65,  0.7 ],\n",
       "       [11.  , 12.  , 13.  , 14.  , 15.  , 16.  , 17.  , 18.  ],\n",
       "       [19.  , 20.  , 21.  , 22.  , 23.  , 24.  , 25.  , 26.  ],\n",
       "       [27.  , 28.  , 29.  , 30.  , 31.  , 32.  , 33.  , 34.  ],\n",
       "       [35.  , 36.  , 37.  , 38.  , 39.  , 40.  , 41.  , 42.  ],\n",
       "       [43.  , 44.  , 45.  , 46.  , 47.  , 48.  , 49.  , 50.  ]])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# vstack 垂直方向堆叠\n",
    "np.vstack((n2, n1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b01a647-8cd2-4f92-989a-75f41f19ea57",
   "metadata": {},
   "source": [
    "## 数组拆分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "e53e4127-c31f-4558-a880-5d9d018c5a8b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[8, 8, 8, 8, 8],\n",
       "       [7, 0, 0, 3, 6],\n",
       "       [8, 7, 4, 0, 9],\n",
       "       [3, 0, 9, 3, 2],\n",
       "       [3, 2, 0, 8, 3],\n",
       "       [2, 4, 9, 7, 6]])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用split来拆分\n",
    "# 参数：如果不是传入的列表，则表示等分\n",
    "arr = np.random.randint(0, 10, size=(6, 5))\n",
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "1dc1c3d4-0d28-4544-ae41-bc16f8254016",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[8, 8, 8, 8, 8],\n",
       "        [7, 0, 0, 3, 6]]),\n",
       " array([[8, 7, 4, 0, 9],\n",
       "        [3, 0, 9, 3, 2]]),\n",
       " array([[3, 2, 0, 8, 3],\n",
       "        [2, 4, 9, 7, 6]])]"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.split(arr, 3)   # 默认按行分，分成3等分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "241be192-c944-433b-bcb3-a3ffdd0706e3",
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "array split does not result in an equal division",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[43], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit\u001b[49m\u001b[43m(\u001b[49m\u001b[43marr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m  \u001b[38;5;66;03m# 要是无法等分，就会报错\u001b[39;00m\n",
      "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\numpy\\lib\\shape_base.py:864\u001b[0m, in \u001b[0;36msplit\u001b[1;34m(ary, indices_or_sections, axis)\u001b[0m\n\u001b[0;32m    862\u001b[0m     N \u001b[38;5;241m=\u001b[39m ary\u001b[38;5;241m.\u001b[39mshape[axis]\n\u001b[0;32m    863\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m N \u001b[38;5;241m%\u001b[39m sections:\n\u001b[1;32m--> 864\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m    865\u001b[0m             \u001b[38;5;124m'\u001b[39m\u001b[38;5;124marray split does not result in an equal division\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m    866\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m array_split(ary, indices_or_sections, axis)\n",
      "\u001b[1;31mValueError\u001b[0m: array split does not result in an equal division"
     ]
    }
   ],
   "source": [
    "np.split(arr, 2, axis=1)  # 要是无法等分，就会报错"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "a6ac1484-8800-4914-bd8a-62e83c7e3f22",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[8, 8, 8, 8, 8]]),\n",
       " array([[7, 0, 0, 3, 6],\n",
       "        [8, 7, 4, 0, 9]]),\n",
       " array([[3, 0, 9, 3, 2],\n",
       "        [3, 2, 0, 8, 3],\n",
       "        [2, 4, 9, 7, 6]])]"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果传入的参数是一个数组，那么这个数组里的数字就是索引切分点\n",
    "np.split(arr, [1, 3])  # 在索引1和索引3的地方，水平切两刀，分出三个数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "84a52784-9809-4b18-b33e-d3ea8b1ef7b9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[8, 8],\n",
       "        [7, 0],\n",
       "        [8, 7],\n",
       "        [3, 0],\n",
       "        [3, 2],\n",
       "        [2, 4]]),\n",
       " array([[8, 8],\n",
       "        [0, 3],\n",
       "        [4, 0],\n",
       "        [9, 3],\n",
       "        [0, 8],\n",
       "        [9, 7]]),\n",
       " array([[8],\n",
       "        [6],\n",
       "        [9],\n",
       "        [2],\n",
       "        [3],\n",
       "        [6]])]"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.split(arr, [2, 4], axis=1)  # 在索引2和索引4的地方，垂直切两刀，分出三个数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c94c2674-2cbc-45a5-a9ce-7cee26f81847",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
